package refresh_access_token

import (
	"errors"
	"github.com/dgrijalva/jwt-go"
	"time"
)

type MyClaims struct {
	UserID int64 `json:"user_id"`
	jwt.StandardClaims
}

// 自定义JWT的过期时间，这里以2小时为例
const TokenExpireDuration = time.Hour * 2

// 定义Secret
var mySecret = []byte("夏天夏天悄悄过去")

// 生成access token和refresh token
func GenToken(userID int64) (aToken, rToken string, err error) {
	//创建一个自己的声明
	c := MyClaims{
		UserID: userID, //自定义字段
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), //过期时间
			Issuer:    "bluebell_qimi",                            //签发人
		},
	}
	//加密并获得完整的编码后的字符串token
	aToken, err = jwt.NewWithClaims(jwt.SigningMethodHS256, c).SignedString(mySecret)

	//refresh token不需要存任何自定义数据
	rToken, err = jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.StandardClaims{
		ExpiresAt: time.Now().Add(time.Second * 30).Unix(), //过期时间
		Issuer:    "bluebell_qimi",                         //签发人
	}).SignedString(mySecret)
	//使用指定的secret签名并获得完整的编码后的字符串token
	return
}

// 解析JWT
func ParseToken(tokenString string) (claims *MyClaims, err error) {
	//解析token
	var token *jwt.Token
	claims = new(MyClaims)
	token, err = jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		return mySecret, nil
	})
	if err != nil {
		return
	}
	if !token.Valid {
		//校验token
		err = errors.New("invalid token")
	}
	return
}

// 刷新Access Token
//func RefreshToken(aToken, rToken string) (newAToken, newRToken string, err error) {
//	//refresh无效返回
//	if _, err = jwt.Parse(rToken, keyfunc); err != nil {
//		return
//	}
//	//从旧access token中解析出claim数据
//	var claims MyClaims
//	_, err = jwt.ParseWithClaims(aToken, &claims, keyFunc)
//	v, _ := err.(*jwt.ValidationError)
//
//	//当access token是过期错误并且refresh token没有过期时旧创建了一个新的access token
//	if v.Errors == jwt.ValidationErrorExpired {
//		return GenToken(claims.UserID)
//	}
//	return
//}
